﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using iTunesFastForward.Genpuid;

namespace iTunesFastForward.Forms
{
    public partial class ChooseMusicDNS : Form
    {
        iTunesFastForwardForm _form;
        ITTrackInfos[] _infos;
        List<ITTrackInfos> _allTracks;

        public ChooseMusicDNS(iTunesFastForwardForm form, ITTrackInfos[] infos)
        {
            _form = form;
            _infos = infos;
            _allTracks = new List<ITTrackInfos>();

            var i = 0;
            foreach (var info in infos)
            {
                if (info.MatchedTracks != null && info.MatchedTracks.Count > 1)
                    _allTracks.Add(info);
                i++;
            }

            InitializeComponent();

            ShowNextConflicts();
        }

        private void ShowNextConflicts()
        {
            if (_allTracks.Count == 0)
            {
                _form.MusicDNSInfos = _infos;
                _form.MusicDNSApplyTags();
                this.Close();
            }
            else
            {
                if (_allTracks.Count == 1)
                    nexBtutton.Text = "Finish and apply tags";

                var iTTrackInfos = _allTracks[0];

                if (iTTrackInfos.MatchedTracks.Count > 1 || iTTrackInfos.MatchedTracks[0].Releases.Count > 1)
                {
                    tracksListBox.Items.Clear();
                    foreach (var t in _allTracks)
                        tracksListBox.Items.Add(t);
                    tracksListBox.SelectedItem = iTTrackInfos;

                    albumsListBox.Items.Clear();
                    foreach (var m in iTTrackInfos.MatchedTracks)
                    {
                        foreach (var r in m.Releases)
                            albumsListBox.Items.Add(r);
                    }
                }
            }
        }

        private void nextButton_Click(object sender, EventArgs e)
        {
            if (tracksListBox.SelectedIndices.Count == 0)
            {
                Utils.ShowErrorMessage("Please select at least one track.", "Error");
                return;
            }


            if (albumsListBox.SelectedIndex == -1)
            {
                Utils.ShowErrorMessage("Please select an album for the track(s).", "Error");
                return;
            }

            var seltracks = new List<ITTrackInfos>();

            foreach (int tr in tracksListBox.SelectedIndices)
                seltracks.Add(_allTracks[tr]);

            var selRelease = (TrackRelease)albumsListBox.SelectedItem;

            // chercher dans quel fichier est la release
            var selMatchedTrack = _allTracks[0].MatchedTracks.Where(m => m.Releases.Contains(selRelease)).First();

            // spécifier pour chaque track ce qu'il faut

            foreach (var tr in seltracks)
            {
                if (tr.MatchedTracks.Contains(selMatchedTrack))
                    tr.SelectedMatchedTrack = selMatchedTrack;
                
                foreach (var mt in tr.MatchedTracks)
	            {
                    // si la release est dans la matched track
                    if (mt.Releases.Count(r => r.Release == selRelease.Release) >= 1)
                    {

                        // sélectionner la trackrelease correspondante à la release
                        mt.SelectedTrackRelease = mt.Releases.Where(r => r.Release == selRelease.Release).First();

                        // mettre la track à jour sur le form de base et la supprimer de la liste
                        if (tr.SelectedMatchedTrack != null && mt.SelectedTrackRelease != null)
                            _allTracks.Remove(tr);

                        if (tr.MatchedTracks.Count(m => 
                            m.Releases.Count(r => r.Release == selRelease.Release) >= 1) == 1)
                        {
                            tr.SelectedMatchedTrack = mt;
                            _allTracks.Remove(tr);
                        }

                        // faire le test suivant : s'il y a plus de 2 tracks avec le même album et que la 
                        // track n'est pas sélectionnée, ça veut dire que le morceau peut être 
                        // identifié en 2 fois dans le meme album => c'est une erreur il faut laisser
                        // l'utilisateur en juger
                        // en revanche, si une release correspond et qu'elle ne se retrouve que dans une
                        // matched track, il faut appliquer cette matched track

                    }
	            }
                
            }

            ShowNextConflicts();
        }

        private void albumsListBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            var selRelease = (TrackRelease)albumsListBox.SelectedItem;

            titleLabel.Text = selRelease.Track.Title;
            artisLabel.Text = selRelease.Track.Artist.Name;
            
            var s = selRelease.Track.Duration / 1000 % 60;
            var m = Math.Floor((float)selRelease.Track.Duration / 1000 / 60);

            durationLabel.Text = string.Format("{0}min {1}s", m, s);
            albumLabel.Text = selRelease.Release.Title;
            trackNumbeLabel.Text = string.Format("{0}/{1}", selRelease.TrackNumber, selRelease.Release.TrackCount);

            if (selRelease.Release.FirstRelease.HasValue)
                releaseDateLabel.Text = selRelease.Release.FirstRelease.Value.Year.ToString();
            else
                releaseDateLabel.Text = string.Empty;
        }
    }
}
